home *** CD-ROM | disk | FTP | other *** search
- // the implementation of class NET_ITEM_TABLE
- // Copyright (C) 1997 Kazutaka Hirata <khirata@jove.acs.unt.edu>
-
- #include "nilist.h"
- #include "segpoint.h"
- #include "segseg.h"
-
- #include "nitable.h"
-
- void NET_ITEM_TABLE::AddItem(KBAN_DATA& kban_data)
- {
- NET_ITEM_LIST net_item_list;
- net_item_list.collect_kban_data(kban_data);
-
- NET_ITEM_LIST::iterator i;
- reserve(net_item_list.size());
- for(i = net_item_list.begin(); i != net_item_list.end(); i++) {
- push_back(*i);
- }
- }
-
- XY_DBL xy_int2dbl(const XY& xy)
- {
- return XY_DBL(xy.x(), xy.y());
- }
-
- bool is_connected_pin_pin(
- const PIN_ELEMENT& pin1,
- const PIN_ELEMENT& pin2
- )
- {
- XY_DBL ac1 = xy_int2dbl(pin1.ac());
- XY_DBL ac2 = xy_int2dbl(pin2.ac());
- uint threshold = pin1.GetMinimumRadius() + pin2.GetMinimumRadius();
- return (get_distance(ac1, ac2) < threshold) ? true : false;
- }
-
- bool is_connected_pin_line(
- const PIN_ELEMENT& pin,
- const LINE_ELEMENT& line
- )
- {
- XY_DBL ac_o = xy_int2dbl(pin.ac());
- XY_DBL ac_s = xy_int2dbl(line.ac_s());
- XY_DBL ac_e = xy_int2dbl(line.ac_e());
- SEGMENT seg(ac_s - ac_o, ac_e - ac_o);
- uint threshold = pin.GetMinimumRadius() + line.GetMinimumRadius();
- return (GetDistanceFromOrigin(seg) < threshold) ? true : false;
- }
-
- bool is_connected_line_line(
- const LINE_ELEMENT& line1,
- const LINE_ELEMENT& line2
- )
- {
- XY_DBL ac1_s = xy_int2dbl(line1.ac_s());
- XY_DBL ac1_e = xy_int2dbl(line1.ac_e());
- XY_DBL ac2_s = xy_int2dbl(line2.ac_s());
- XY_DBL ac2_e = xy_int2dbl(line2.ac_e());
- SEGMENT seg1(ac1_s, ac1_e);
- SEGMENT seg2(ac2_s, ac2_e);
- uint threshold = line1.GetMinimumRadius() + line2.GetMinimumRadius();
- return (segseg(seg1, seg2) < threshold) ? true : false;
- }
-
- bool is_connected_item_item(const NET_ITEM& item1, const NET_ITEM& item2)
- {
- bool result = false;
- if((item1.type() == NET_ITEM::ITEM_PIN) && (item2.type() == NET_ITEM::ITEM_PIN)) {
- const PIN_ELEMENT& pin_element1 = item1.get_pin_element();
- const PIN_ELEMENT& pin_element2 = item2.get_pin_element();
- if(is_connected_pin_pin(pin_element1, pin_element2)) {
- result = true;
- }
- } else if((item1.type() == NET_ITEM::ITEM_PIN) && (item2.type() == NET_ITEM::ITEM_LINE)) {
- const PIN_ELEMENT& pin_element = item1.get_pin_element();
- const LINE_ELEMENT& line_element = item2.get_line_element();
- if(is_connected_pin_line(pin_element, line_element)) {
- result = true;
- }
- } else if((item1.type() == NET_ITEM::ITEM_LINE) && (item2.type() == NET_ITEM::ITEM_PIN)) {
- const LINE_ELEMENT& line_element = item1.get_line_element();
- const PIN_ELEMENT& pin_element = item2.get_pin_element();
- if(is_connected_pin_line(pin_element, line_element)) {
- result = true;
- }
- } else if((item1.type() == NET_ITEM::ITEM_LINE) && (item2.type() == NET_ITEM::ITEM_LINE)) {
- const LINE_ELEMENT& line_element1 = item1.get_line_element();
- const LINE_ELEMENT& line_element2 = item2.get_line_element();
- if(is_connected_line_line(line_element1, line_element2)) {
- result = true;
- }
- }
- return result;
- }
-
- void NET_ITEM_TABLE::GenerateNetlist(uint layer_number)
- {
- for(uint i = 0; i < size(); i++) {
- NET_ITEM& item1 = (*this)[i];
- if((item1.layer_number() != LAYER_PATTERN_COMMON)
- && (item1.layer_number() != layer_number )) {
- continue;
- }
- for(uint j = i + 1; j < size(); j++) {
- if(IsConnected(i, j)) {
- continue;
- }
- NET_ITEM& item2 = (*this)[j];
- if((item2.layer_number() != LAYER_PATTERN_COMMON)
- && (item2.layer_number() != layer_number )) {
- continue;
- }
- if(is_connected_item_item(item1, item2)) {
- MakeConnection(i, j);
- }
- }
- }
- }
-